// 题目描述
// 116. 填充每个节点的下一个右侧节点指针
// 中等
// 1.1K
// 给定一个 完美二叉树 ，其所有叶子节点都在同一层，每个父节点都有两个子节点。二叉树定义如下：
// struct Node {
//   int val;
//   Node *left;
//   Node *right;
//   Node *next;
// }
// 填充它的每个 next 指针，让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点，则将 next 指针设置为 NULL。
// 初始状态下，所有 next 指针都被设置为 NULL。
//   示例 1：
// 输入：root = [1,2,3,4,5,6,7]
// 输出：[1,#,2,3,#,4,5,6,7,#]
// 解释：给定二叉树如图 A 所示，你的函数应该填充它的每个 next 指针，以指向其下一个右侧节点，如图 B 所示。序列化的输出按层序遍历排列，同一层节点由 next 指针连接，'#' 标志着每一层的结束。
// 示例 2:
// 输入：root = []
// 输出：[]
//   提示：
// 树中节点的数量在 [0, 212 - 1] 范围内
// -1000 <= node.val <= 1000
//   进阶：
// 你只能使用常量级额外空间。
// 使用递归解题也符合要求，本题中递归程序占用的栈空间不算做额外的空间复杂度。
// 通过次数
// 373.4K
// 提交次数
// 512.8K
// 通过率
// 72.8%
// https://leetcode.cn/problems/populating-next-right-pointers-in-each-node

function Node(val, left, right, next) {
  this.val = val === undefined ? null : val
  this.left = left === undefined ? null : left
  this.right = right === undefined ? null : right
  this.next = next === undefined ? null : next
}

/**
 * @param {Node} root
 * @return {Node}
 */
var connect = function (root) {
  if (!root) {
    return null
  }

  let levelCnt = 0
  const queue = [root]
  while (queue.length) {
    levelCnt = queue.length

    let tail = queue[0]
    for (let i = 1; i < levelCnt; i++) {
      tail = tail.next = queue[i]
    }

    for (let i = 0; i < levelCnt; i++) {
      const cur = queue.shift()
      cur.left && queue.push(cur.left)
      cur.right && queue.push(cur.right)
    }
  }

  return root
}

const res = connect(
  new Node(
    1,
    new Node(2, new Node(4), new Node(5)),
    new Node(3, new Node(6), new Node(7))
  )
)

console.log(res)
















